tuple: Make operator<() linear instead of exponential Patch by Matthew Dempsky! git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@226641 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/tuple b/include/tuple index 5fc27f9..93518d8 100644 --- a/include/tuple +++ b/include/tuple 
@@ -927,8 +927,12 @@  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11  bool operator()(const _Tp& __x, const _Up& __y)  { - return __tuple_less<_Ip-1>()(__x, __y) || - (!__tuple_less<_Ip-1>()(__y, __x) && _VSTD::get<_Ip-1>(__x) < _VSTD::get<_Ip-1>(__y)); + const size_t __idx = tuple_size<_Tp>::value - _Ip; + if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y)) + return true; + if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x)) + return false; + return __tuple_less<_Ip-1>()(__x, __y);  }  };